package com.bl.andr.utillib.time;

import android.text.TextUtils;

import com.bl.andr.utillib.MathUtil;
import com.bl.andr.utillib.ValueOf;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * DESC: 时间工具类
 * TIME:2019-06-24
 */
public class DateUtil {

    private DateUtil() {
    }

///////////////////////////////////////////////////////////////////////////
//  格式
///////////////////////////////////////////////////////////////////////////

    private final static String FORMAT_DEFAULT = "yyyy-MM-dd HH:mm:ss";


///////////////////////////////////////////////////////////////////////////
// DATE
///////////////////////////////////////////////////////////////////////////

    /**
     * 判断原日期是否在目标日期之前
     */
    public static boolean isBefore(Date src, Date dst) {
        return src.before(dst);
    }

    /**
     * 判断原日期是否在目标日期之后
     */
    public static boolean isAfter(Date src, Date dst) {
        return src.after(dst);
    }

    /**
     * 判断两日期是否相同
     */
    public static boolean isEqual(Date date1, Date date2) {
        return date1.compareTo(date2) == 0;
    }

    /**
     * 判断某个日期是否在某个日期范围
     *
     * @param beginDate 日期范围开始
     * @param endDate   日期范围结束
     * @param src       需要判断的日期
     */
    public static boolean between(Date beginDate, Date endDate, Date src) {
        return beginDate.before(src) && endDate.after(src);
    }


    /**
     * 一种时间格式转化成另一种时间格式
     *
     * @param srcDate   原日期格式字符串
     * @param srcFormat 原格式
     * @param objFormat 目标格式
     * @return 目标格式字符串
     */
    public static String convert(String srcDate, String srcFormat, String objFormat) {
        long time = parse2MilliSec(srcDate, srcFormat);
        return formatMilliSec(time, objFormat);
    }


    /**
     * 获得当前时间的<code>java.util.Date</code>对象
     * now().getTime() = {@link #nowMilliSec() }
     */
    public static Date now() {
        return new Date();
    }

    /**
     * 返回当前unix时间戳 (1970年至今的 秒数)
     */
    public static long nowSec() {
        return nowMilliSec() / 1000;
    }

    /**
     * 返回当前unix时间戳 (1970年至今的 毫秒数)
     */
    public static long nowMilliSec() {
        return System.currentTimeMillis();
    }

    /**
     * 得到今天的日期字符串
     */
    public static String nowDateStr(String format) {
        return format(now(), format);
    }

    /**
     * 给定日历对象 获取对应的日期对象
     *
     * @param c Calendar 对象
     * @return Date 对象
     */
    public Date getDate(Calendar c) {
        if (c == null) {
            return now();
        }
        return c.getTime();
    }


///////////////////////////////////////////////////////////////////////////
// DATE :
//       时间字符串 <=> date
///////////////////////////////////////////////////////////////////////////

    public static SimpleDateFormat getSDF(String format) {
        if (TextUtils.isEmpty(format))
            format = FORMAT_DEFAULT;
        return new SimpleDateFormat(format, Locale.CHINA);
    }



    public static long parse2Sec(String dateStr, String format) {
        return parse2MilliSec(dateStr, format) / 1000;
    }


    public static long parse2MilliSec(String dateStr, String format) {
        if (TextUtils.isEmpty(dateStr)) {
            return 0;
        }
        Date date = parse(dateStr, format);
        if (date != null)
            return date.getTime();
        return 0;
    }


    /**
     * @param dateStr 需要转化的日期字符串
     * @param format  日期格式
     */
    public static Date parse(String dateStr, String format) {
        if (TextUtils.isEmpty(dateStr)) {
            return null;
        }
        Date date = null;
        try {
            date = getSDF(format).parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }


    public static String formatSec(String timeStamp, String format) {
        long time = ValueOf.toLong(timeStamp, 0L);
        return formatSec(time, format);
    }


    public static String formatSec(long timeStamp, String format) {
        return formatMilliSec(timeStamp * 1000, format);
    }


    public static String formatMilliSec(String timeStamp, String format) {
        long time = ValueOf.toLong(timeStamp, 0L);
        return formatMilliSec(time, format);
    }


    public static String formatMilliSec(long timeStamp, String format) {
        if (timeStamp == 0) return "";
        return format(new Date(timeStamp), format);
    }


    public static String format(Date d, String format) {
        if (d == null) {
            return "";
        }
        return getSDF(format).format(d);
    }






}
